
package carmadness.model;

/**
 * A rendőr járművét megvalósító osztály.
 * 
 * @author Metzing Arpad
 * @version 1.0
 * @created 10-Apr-2010 2:32:41 PM
 */
public class Police extends Vehicle
{

	/**
	 * A létrehozott példányok száma.
	 */
	private static int instances;

	private static final int targetInstanceCount = 1;

	/**
	 * A rendőr jármű konstruktora.
	 * 
	 * @param _strategy
	 *            Döntési stratégia
	 */
	public Police( Strategy _strategy )
	{
		super( _strategy );
		this.baseWeight = 100f;
		Police.instances++;
	}

	/**
	 * Alapértelmezett konstruktor. Alapesetben a rendőrnek véletlenszerű
	 * döntési stratégiát vesz fel.
	 */
	public Police()
	{
		this( new RandomStrategy() );
	}

	public static void reset()
	{
		instances = 0;
	}

	/**
	 * Visitor minta szerinti accept metódus. Járművek üköztetésekor használt.
	 * 
	 * @param visitor
	 *            Az ütköző jármű
	 */
	public void accept( IVehicleVisitor visitor )
	{
		visitor.visitVehicle( this );
	}

	/**
	 * Visszatér a példányok számával.
	 * 
	 * @return a példányok száma
	 */
	public static int getInstanceCount()
	{
		return Police.instances;
	}

	public static final int getTargetInstanceCount()
	{
		return targetInstanceCount;
	}

	/**
	 * Sebességkorlátozás típusú szabály alkalmazása a rendőrre.
	 * Sebességkorlátozás nincs hatással a rendőrre.
	 * 
	 * @param rule
	 *            SpeedLimit típusú szabály.
	 */
	public void visitRule( SpeedLimit rule )
	{
		return;
	}

	/**
	 * Lámpás kereszteződés típusú szabály alkalmazása rendőrre. Lámpa nincs
	 * hatással a rendőrre.
	 * 
	 * @param rule
	 *            TrafficLight típusú szabály.
	 */
	public void visitRule( TrafficLight rule )
	{
		return;
	}

	/**
	 * Stoptábla típusú szabály alkalmazása rendőrre. Stoptábla nincs hatással a
	 * rendőrre.
	 * 
	 * @param rule
	 *            StopSign típusú szabály.
	 */
	public void visitRule( StopSign rule )
	{
		return;
	}

	/**
	 * Egy útelemen lévő rendőrbe "hátulról" beleütközött egy civil
	 * 
	 * @param Civilian
	 *            vehicle - a "hibás" civil
	 */
	@Override
	public void visitVehicle( Civilian vehicle )
	{
		// ILYEN ELVILEG NEM FORDULHAT ELO"!!!
		return;
	}

	/**
	 * Egy útelemen lévő rendőrbe "hátulról" beleütközött egy másik rendőr
	 * 
	 * @param Police
	 *            vehicle - a "hibás" rendőr
	 */
	@Override
	public void visitVehicle( Police vehicle )
	{
		// ELVILEG ILYEN SEM FORDULHAT ELO"
		return;
	}

	/**
	 * Egy útelemen lévő rendőrbe "hátulról" beleütközött egy rabló
	 * 
	 * @param Police
	 *            vehicle - a rabló
	 */
	public void visitVehicle( Robber vehicle )
	{
		// Ha a rabló éppen nem halhatatlan
		if ( vehicle.getImmortalityLeft() == 0 )
			vehicle.kill();
		// Ha halhatatlan, a rendőr hal meg
		else
			this.kill();
	}

	/**
	 * A rendőr megsemmisítéséről gondoskodó osztály.
	 * 
	 * Eggyel csökkenti a rendőrpéldányok számát.
	 */
	public void kill()
	{
		super.kill();
		Police.instances--;
	}

}
